package utils 
{
	import flash.geom.Point;
	/**
	 * @author Nicolas Barradeau
	 * http://en.nicoptere.net
	 */
	public class GeomUtils
	{
		/**
		 * retourne l'angle entre p0 et p1
		 * @param	p0
		 * @param	p1
		 * @return
		 */
		static public function angle( p0:Point, p1:Point ):Number
		{
			
			return Math.atan2( p1.y - p0.y, p1.x - p0.x );
			
		}
		/**
		 * retourne la distance entre p0 et p1
		 * @param	p0
		 * @param	p1
		 * @return
		 */
		static public function distance( p0:Point, p1:Point ):Number
		{
			
			return Math.sqrt( squareDistance( p0.x, p0.y, p1.x, p1.y ) );
			
		}
		
		/**
		 * retourne la distance entre p0 et p1
		 * @param	p0
		 * @param	p1
		 * @return
		 */
		static public function squareDistance( x0:Number, y0:Number, x1:Number, y1:Number ):Number
		{
			
			var dx:Number = x0 - x1;
			var dy:Number = y0 - y1;
			return dx * dx + dy * dy;
			
		}
		
		/**
		 * retourne le palier dans lequel la valeur se situe
		 * @param	value un Number normalise (0-1)
		 * @param	step valeur du palier
		 * @return
		 */
		static public function clamp( value:Number, step:Number ):Number
		{
			return int( ( value * step ) ) / step ;
		}
		
		
		/**
		 * interpolation lineaire de T entre 2 valeurs A et B
		 * @param	t
		 * @param	a
		 * @param	b
		 * @return
		 */
		static public function lerp( t:Number, a:Number, b:Number ):Number
		{
			
			var min:Number = ( a < b ) ? a : b;
			var max:Number = ( a > b ) ? a : b;
			return min + ( max - min ) * t;
			
		}
		
		/**
		 * retourne la valeur normalisée de value entre A et B
		 * @param	value
		 * @param	a
		 * @param	b
		 * @return
		 */
		static public function normalize( value:Number, a:Number, b:Number ):Number
		{
			
			var min:Number = ( a < b ) ? a : b;
			var max:Number = ( a > b ) ? a : b;
			return (value - min) / (max - min);
			
		}
		
		/**
		 * permet de borner une valeur entre 2 plages de valeurs 
		 * @param	value
		 * @param	min1
		 * @param	max1
		 * @param	min2
		 * @param	max2
		 * @return
		 */
		static public function map(value:Number, min1:Number, max1:Number, min2:Number, max2:Number):Number
		{
			
			return lerp( normalize( value, min1, max1 ), min2, max2 );
			
		}
		
		

	}

}